Oculus Quest2では外部カメラ、パススルーを利用することが可能です
Oculus Quest2では白黒+解像度がめちゃくちゃ低い… という欠点はありますが例えば疑似AR演出などには利用できるかと思います
Oculus Proではカラーで映る模様です。 将来的には外部カメラの解像度も上がり、ARとしての使い道も十分にできるのではないかと考えています
開発環境は
- Unity2022.1.20f1
- Oculus Quest2
Document
https://developer.oculus.com/documentation/unity/unity-passthrough/
また、以下のサイト様を参考にさせていただいています(いつも大変お世話になっています) https://framesynthesis.jp/tech/
環境準備
Oculus Quest2でパススルーを利用するためにはOculusの統合環境である Oculus Integration が必要です 2022/11 現在、Unity Asset Store から導入 https://assetstore.unity.com/packages/tools/integration/oculus-integration-82022?locale=ja-JP
2023年にはUnityPackageManagerにより、必要なものを個別に導入することが可能になるようです https://developer.oculus.com/blog/unity-package-manager-integration-sdks/
VR機器共通Unity SDKである
- XR Interaction Toolkit
- OpenXR Plugin
のみでも出来ないかなと思ったのですが.. 現状無理でした
もしOculus以外のVR機器にも対応させる場合は適宜SDKやPrefabを入れ替える(有効/無効化)させて上げる必要があります
実装
VRの設定は終わっている前提として Unity Editor上で Air Link を利用したデバッグを想定ですすめます
ビルドターゲットはAndroidに設定
XR Plug-in Management
ここではOculus 独自の機能を利用するため Oculus を選択
ちなみに Stereo Rendering Mode は シングルパス(Instanced) を選択してあります
Prefab設定
OVRCameraRig.prefab をOculusSDKから取り出してシーンに配置
OVR Manager では
- Passthrough Capability Enabled にチェックを入れる
- Enable Passthrough にチェックを入れる
そして CVRPassthrough Layer をアタッチ
OVR Passthrough Layer の設定で重要な箇所として Compositing 内の Placement 項目にて合成方法を Overlay または Underlay の選択が可能です。
もし上にオブジェクトを置きたい場合は Underlay にする必要があります
複数の OVRPassthroughLayer を利用したい場合などは、Composition Depth 設定にて描画順序を適切に設定してあげます (利用するかは不明として最大3つのインスタンスをアクティブにすることが出来るようです)
以上のみで、PlayModeに入った時に外部カメラが利用されて画面に表示されます
もし Underlay 設定で実行時に SkyBox が見えているようであれば Window → Rendering → Environment からSkyBoxMaterialを削除してください。 もし削除できないのであればCameraのBackgroundTypeを UnInitialized に変更するなど対応が必要です
スクリプトから任意のタイミングでONにする
ほか設定はそのままに OVR Manager の Enable Passthrough のチェックをOFFIに。
後はスクリプト側でOVRManagerのインスタンスから ON/OFF を切り替えると動作
public void SetEnable(bool isEnable)
{
OVRManager.instance.isInsightPassthroughEnabled = isEnable;
}
その他
Oculusではパススルーの使い方に関するページを公開しています https://developer.oculus.com/documentation/unity/unity-customize-passthrough/#style
例えばカメラで写した映像の明度、コンストラクトの変更、グレイスケールにした後アウトラインの強調など
また、サーフェイスの描画先をMeshRendererとして描画することも可能のようです Projection surface を User Defined に変更してスクリプト上で操作
また、それらはサンプルプロジェクトとしてSDK内に含まれているのでこれを確認するのが非常におすすめです https://developer.oculus.com/documentation/unity/unity-sf-passthrough/
パススルーが表示されない
実装している中でパススルーが表示されない現象にハマったのでメモ
UnderLay + Camera の Environment → Background Type をSkyboxにしている
正距円筒図法の動画を再生しない場合、実行時にSkyboxコンポーネントのEnableが外れるようにしているため問題ないと思っていたのですがここがSkyboxになっていると黒で塗りつぶされてしまいます
�